export const NAME = 'JIESS_CONSTRUCTOR';
export const JIESS_TAG = 'THIS_IS_JIESS';
export const isObject = (v) => {
	return v && typeof v === 'object';
}
export const hasAttr = (v, field) => {
	return isObject(v) && Reflect.has(v, field);
}
export const check = (obj, tag, field = NAME) => {
	return isObject(obj) && (obj[field] === tag)
}
// 是否未定义
export const isUndef = (v, b) => {
	const checkArr = [null, undefined, NaN];
	if (b && v === '')
		return true;
	return checkArr.some(val => Object.is(val, v));
};
// 是否已定义
export const isDef = (v, b) => !isUndef(v, b);
// 判断是否为函数，再执行
export function initExecute(...args1) {
	return (func, args2 = [], def) => {
		if (typeof func === 'function') {
			let dd = null;
			if (this) {
				dd = func.call(this, ...args1, ...args2);
			} else {
				dd = func(...args1, ...args2);
			}
			return dd === undefined ? def : dd;
		} else {
			return def === undefined ? func : def;
		}
	}
}
// 针对options可能的数据类型
export function done(options, callback) {
	let result = null;
	if (options) {
		if (Object.prototype.toString.call(options) === '[object AsyncFunction]') {
			// 使用异步函数
			options().then(callback);
		} else if (Array.isArray(options)) {
			result = options;
		} else if (typeof options === 'function') {
			options((data) => {
				// 状态已变，通知更新 | 状态未变，直接赋值
				result ? callback(data) : (result = data);
			});
		} else if (check(options, 'Observe')) {
			// 使用jiess响应式对象
			options.observe(callback);
			// 在同步过程中提供初始值
			result = options.value;
		}
	}
	// 这里的result一定要赋值，切记切记
	return (result = Array.isArray(result) ? result : []);
};
// =================================================================
// 数值转化为像素
export const converPX = (v) => {
	if (v) {
		return typeof v === 'number' ? `${v}px` : v;
	} else {
		return '0px';
	}
}
// 值转化，可按下标提取值
export const converValue = (v, k) => {
	if (Array.isArray(v)) {
		v = v.map(val => converPX(val));
		// 如果给定下标，则按数组下标进行取值
		if (k && typeof k === "number") v = v[k];
	} else {
		v = converPX(v);
	}
	return v;
}
// 提取响应式中的数据
export const refValue = (v) => {
	// ref响应式，computed响应式，这两种数据均需要提取value作为真实值
	return (isObject(v) && (v['_isJiessRef'] || v['_isJiessComputed'])) ? v.value : v;
}